package com.lft06.lambdaexpression;

/**
 * Function: 		A {@code TestLambda} object With Some FUNCTION.<br/>
 * Reason:   		ADD REASON.<br/>
 * Date:            2021-01-27 13:02<br/>
 * <p>
 * Class Name:      TestLambda<br/>
 * Package Name:    com.lft06.lambdaexpression<br/>
 * @author Laifengting / E-mail:laifengting@foxmail.com
 * @version 1.0.0
 * @since JDK 8
 */
public class TestLambda2 {
	/**
	 * 2. 静态内部类
	 */
	static class Love2 implements ILove {
		@Override
		public String love(String name) {
			return "我爱你——" + name;
		}
	}
	
	public static void main(String[] args) {
		ILove iLove = new Love();
		System.out.println(iLove.love("外部定义的类"));
		
		iLove = new Love2();
		System.out.println(iLove.love("静态内部类"));
		
		/**
		 * 3. 局部内部类
		 */
		class Love3 implements ILove {
			@Override
			public String love(String name) {
				return "我爱你——" + name;
			}
		}
		iLove = new Love3();
		System.out.println(iLove.love("局部内部类"));
		
		/**
		 * 4. 匿名内部类
		 */
		iLove = new ILove() {
			@Override
			public String love(String name) {
				return "我爱你——" + name;
			}
		};
		System.out.println(iLove.love("匿名内部类"));
		
		/**
		 * 5. lambda表达式
		 */
		iLove = (String name) -> "我爱你——" + name;
		System.out.println(iLove.love("lambda表达式"));
		
		/**
		 *
		 * 6. lambda表达式(省略参数类型)
		 */
		iLove = (name) -> "我爱你——" + name;
		System.out.println(iLove.love("lambda表达式(省略参数类型)"));
		
		/**
		 *
		 * 7. lambda表达式(单个参数可以省略括号)
		 */
		iLove = name -> "我爱你——" + name;
		System.out.println(iLove.love("lambda表达式(单个参数可以省略括号)"));
		
		// 要使用 lambda 表达式前提是接口必须是函数式接口。
		// lambda 表达式只能有一行代码的情况下才能简化成为一行，如果有多行，那么就需要用代码块包裹。
		// 多个参数也可以去掉参数类型，要去掉就都去掉。f
		
	}
}

interface ILove {
	String love(String name);
}

/**
 * 1. 外部定义的实现类
 */
class Love implements ILove {
	@Override
	public String love(String name) {
		return "我爱你——" + name;
	}
}